From 9568674036933068b65d976f1a7200405c5104a8 Mon Sep 17 00:00:00 2001
From: tsteven4 <13596209+tsteven4@users.noreply.github.com>
Date: Fri, 6 Jan 2023 10:05:50 -0700
Subject: [PATCH] another use of potentially invalid waypt field. (#974)
* another use of potentially invalid waypt field.
* fix erroneous comparison of optional waypt values.
---
defs.h | 3 +++
gtrnctr.cc | 4 ++--
trackfilter.cc | 7 +++----
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/defs.h b/defs.h
index 0b50d1f95..e159b4319 100644
--- a/defs.h
+++ b/defs.h
@@ -323,6 +323,9 @@ struct bounds {
#define WAYPT_GET(wpt,member,def) (((wpt)->wpt_flags.member) ? ((wpt)->member) : (def))
#define WAYPT_UNSET(wpt,member) wpt->wpt_flags.member = 0
#define WAYPT_HAS(wpt,member) ((wpt)->wpt_flags.member)
+#define WAYPT_EQUAL(wpta,wptb,member) (((wpta)->wpt_flags.member && (wptb)->wpt_flags.member && \
+ ((wpta)->member == (wptb)->member)) || \
+ (!(wpta)->wpt_flags.member && !(wptb)->wpt_flags.member))
/*
* This is a waypoint, as stored in the GPSR. It tries to not
diff --git a/gtrnctr.cc b/gtrnctr.cc
index 81f1dcee6..b9ff1b816 100644
--- a/gtrnctr.cc
+++ b/gtrnctr.cc
@@ -192,11 +192,11 @@ GtrnctrFormat::gtc_waypt_pr(const Waypoint* wpt)
if (wpt->cadence) {
gtc_write_xml(0, "%d\n", wpt->cadence);
}
- if (wpt->speed || wpt->power) {
+ if (WAYPT_HAS(wpt, speed) || wpt->power) {
gtc_write_xml(1, "\n");
gtc_write_xml(1, "\n");
/* see http://www8.garmin.com/xmlschemas/ActivityExtensionv2.xsd */
- if (wpt->speed) {
+ if (WAYPT_HAS(wpt, speed)) {
gtc_write_xml(0, "%.3f\n", wpt->speed);
}
if (wpt->power) {
diff --git a/trackfilter.cc b/trackfilter.cc
index f60371f26..4482afe35 100644
--- a/trackfilter.cc
+++ b/trackfilter.cc
@@ -903,12 +903,11 @@ bool TrackFilter::trackfilter_points_are_same(const Waypoint* wpta, const Waypoi
std::abs(wpta->latitude - wptb->latitude) < .00001 &&
std::abs(wpta->longitude - wptb->longitude) < .00001 &&
std::abs(wpta->altitude - wptb->altitude) < 20 &&
- (WAYPT_HAS(wpta,course) == WAYPT_HAS(wptb,course)) &&
- (wpta->course == wptb->course) &&
- (wpta->speed == wptb->speed) &&
+ WAYPT_EQUAL(wpta, wptb, course) &&
+ WAYPT_EQUAL(wpta, wptb, speed) &&
(wpta->heartrate == wptb->heartrate) &&
(wpta->cadence == wptb->cadence) &&
- (wpta->temperature == wptb->temperature);
+ WAYPT_EQUAL(wpta, wptb, temperature);
}
void TrackFilter::trackfilter_segment_head(const route_head* rte)
--
2.30.2